/*
 * Copyright 2014 Alex Curran
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.github.amlcurran.showcaseview;

import ohos.agp.animation.Animator;
import ohos.agp.animation.AnimatorProperty;
import ohos.agp.animation.AnimatorValue;
import ohos.agp.components.Component;
import ohos.agp.utils.Point;

class AnimatorAnimationFactory implements AnimationFactory {
    private static final String ALPHA = "alpha";
    private static final float INVISIBLE = 0f;
    private static final float VISIBLE = 1f;

    @Override
    public void fadeInView(Component target, long duration, final AnimationStartListener listener) {
        AnimatorProperty animatorProperty = target.createAnimatorProperty();
        animatorProperty.setCurveType(Animator.CurveType.LINEAR);
        animatorProperty.alphaFrom(0f).alpha(1.0f).setDuration(duration);
        animatorProperty.setStateChangedListener(new Animator.StateChangedListener() {
            @Override
            public void onStart(Animator animator) {
                listener.onAnimationStart();
            }

            @Override
            public void onStop(Animator animator) {
            }

            @Override
            public void onCancel(Animator animator) {
            }

            @Override
            public void onEnd(Animator animator) {
            }

            @Override
            public void onPause(Animator animator) {
            }

            @Override
            public void onResume(Animator animator) {
            }
        });
        animatorProperty.start();
    }

    @Override
    public void fadeOutView(Component target, long duration, final AnimationEndListener listener) {
        AnimatorProperty animatorProperty = target.createAnimatorProperty();
        animatorProperty.setCurveType(Animator.CurveType.LINEAR);
        animatorProperty.alphaFrom(1.0f).alpha(0f).setDuration(duration);
        animatorProperty.setStateChangedListener(new Animator.StateChangedListener() {
            @Override
            public void onStart(Animator animator) {
            }

            @Override
            public void onStop(Animator animator) {
            }

            @Override
            public void onCancel(Animator animator) {
            }

            @Override
            public void onEnd(Animator animator) {
                listener.onAnimationEnd();
            }

            @Override
            public void onPause(Animator animator) {
            }

            @Override
            public void onResume(Animator animator) {
            }
        });
        animatorProperty.start();
    }

    @Override
    public void animateTargetToPoint(ShowcaseView showcaseView, Point point) {
        AnimatorValue animatorValue = new AnimatorValue();
        animatorValue.setCurveType(Animator.CurveType.LINEAR);
        int pointX = point.getPointXToInt();
        int pointY = point.getPointYToInt();
        int showCaseX = showcaseView.showcaseX;
        int showCaseY = showcaseView.showcaseY;
        animatorValue.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() {
            @Override
            public void onUpdate(AnimatorValue animatorValue, float v) {
                showcaseView.showcaseX = (int) (showCaseX + v * (pointX - showCaseX));
                showcaseView.showcaseY = (int) (showCaseY + v * (pointY - showCaseY));
                showcaseView.invalidate();
            }
        });
        animatorValue.start();
    }
}
